/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.hssf.util.Region;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKReporteProduccion;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCliente;
import pe.com.cotelasa.scp.dominio.service.IServicioCotizacion;
import pe.com.cotelasa.scp.dominio.service.IServicioFacturaProforma;
import pe.com.cotelasa.scp.dominio.service.IServicioGuiaRemision;
import pe.com.cotelasa.scp.dominio.service.IServicioKardex;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenPedido;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.CategoriaArticulo;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.ComposicionArticulo;
import pe.com.cotelasa.scp.entidad.Cotizacion;
import pe.com.cotelasa.scp.entidad.DetalleGuiaRemision;
import pe.com.cotelasa.scp.entidad.DetallePedidoFp;
import pe.com.cotelasa.scp.entidad.FacturaProforma;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.Kardex;
import pe.com.cotelasa.scp.entidad.KardexPK;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author WINDOWS 7
 */
@Named(value = "MBReporteProduccion")
@Scope("request")
public class MBReporteProduccion extends MBGenerico implements Serializable {

    private static Logger logger = Logger.getLogger(MBReporteProduccion.class);
    @Inject
    private BKReporteProduccion bkReporte;
    @Inject
    private IServicioCotizacion servicioCotizacion;
    @Inject
    private IServicioFacturaProforma servicioFacturaProforma;
    @Inject
    private IServicioKardex servicioKardex;
    @Inject
    private IServicioOrdenPedido servicioOP;
    @Inject
    private IServicioGuiaRemision servicioGuia;
    @Inject
    private IServicioOrdenCompraServicio servicioOCS;
    @Autowired
    BKSession session;
    @Autowired
    @Qualifier("serviceProperties")
    protected Properties serviceProperties;

    public String mostrarMantenimiento() {
        bkReporte.setCotizacionBusqueda(new Cotizacion());
        bkReporte.setFacturaProformaBusqueda(new FacturaProforma());
        bkReporte.setOrdenPedidoBusqueda(null);

        try {
            OrdenPedido ordenP = new OrdenPedido();
            ordenP.setIdEmpresa(session.getEmpresa());
            bkReporte.setListaOrdenesPedido(servicioOP.listarOrdenesPedidoActivosPorEmpresa(ordenP));
        } catch (ServiceException e) {
            e.printStackTrace();
        }

        return URLPaginacion.Cotizacion.URL_REPORTES_PRODUCCION;

    }

    public void reporteCotizacionesPorCliente() throws IOException, ServiceException {
        Cotizacion cotiza = bkReporte.getCotizacionBusqueda();

        cotiza.setCodigo(cotiza.getTipoCot() + "-");
        cotiza.setVersion(-1);
        cotiza.setIdEmpresa(session.getEmpresa());
        cotiza.setNombreProducto("");
        Collection<Cotizacion> listaCotizacion = this.servicioCotizacion.buscarCotizacionesPorFiltro(cotiza, bkReporte.getFechaInicioCot(), bkReporte.getFechaFinalCot());

        //Workbook workbook = new XSSFWorkbook(OPCPackage.open(new FileInputStream("d:/ChartSample.xlsx"))); // or sample.xls
        FileInputStream file = new FileInputStream(new File(serviceProperties.getProperty("path.server.excel") + "cotizaciones.xls"));
        HSSFWorkbook wb = new HSSFWorkbook(file);
        //HSSFSheet sheet = wb.createSheet("Cotizaciones");
        HSSFSheet sheet = wb.getSheetAt(0);

        sheet.setAutobreaks(true);
        sheet.setColumnWidth(0, 1000);
        sheet.setColumnWidth(1, 5000);
        sheet.setColumnWidth(2, 12000);
        sheet.setColumnWidth(3, 2000);

        sheet.setColumnWidth(5, 10000);
        sheet.setColumnWidth(6, 4000);
        sheet.setAlternativeFormula(true);
        //sheet.setVerticallyCenter(true);
        sheet.setRowSumsBelow(true);

        HSSFCellStyle borderStyle = wb.createCellStyle();
        borderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle borderDotStyle = wb.createCellStyle();
        borderDotStyle.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderRight(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderTop(HSSFCellStyle.BORDER_DOTTED);

        /**
         * ***** fuente para titulo ******************
         */
        HSSFFont cabFont = wb.createFont();
        //cabFont.setColor(HSSFColor.RED.index);
        cabFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cabFont.setFontHeightInPoints(Short.valueOf("11"));

        HSSFCellStyle cabStyle = wb.createCellStyle();
        cabStyle.setFont(cabFont);
        cabStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        /**
         * ***** fuente para clientes ******************
         */
        HSSFFont cliFont = wb.createFont();
        cliFont.setColor(HSSFColor.BLUE.index);
        cliFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cliFont.setFontHeightInPoints(Short.valueOf("9"));

        HSSFCellStyle cliStyle = wb.createCellStyle();
        //cliStyle.cloneStyleFrom(borderStyle);
        cliStyle.setFont(cliFont);
        cliStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        /**
         * ***** fuente para total por cliente ******************
         */
        HSSFFont cantFont = wb.createFont();
        cantFont.setColor(HSSFColor.BROWN.index);
        cantFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cantFont.setFontHeightInPoints(Short.valueOf("9"));

        HSSFCellStyle cantStyle = wb.createCellStyle();
        cantStyle.cloneStyleFrom(borderStyle);
        cantStyle.setFont(cantFont);

        /**
         * ***** fuente para detalle de cotizacion ******************
         */
        HSSFFont contFont = wb.createFont();
        contFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle contStyle = wb.createCellStyle();
        contStyle.cloneStyleFrom(borderDotStyle);
        contStyle.setFont(contFont);
        contStyle.setWrapText(true);

        /**
         * ***** fuente para generado por ******************
         */
        HSSFFont genFont = wb.createFont();
        genFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        genFont.setFontHeightInPoints(Short.valueOf("7"));


        HSSFCellStyle genStyle = wb.createCellStyle();
        genStyle.setFont(genFont);
        genStyle.setWrapText(true);


        HSSFRow rowCab;
        if (sheet.getRow(0) == null) {
            rowCab = sheet.createRow(0);
        } else {
            rowCab = sheet.getRow(0);
        }


        HSSFCell cellCab0 = rowCab.createCell(3);
        cellCab0.setCellStyle(cabStyle);
        String tipo = cotiza.getTipoCot() == 'T' ? "TELA" : "PRENDA";
        cellCab0.setCellValue("REPORTE DE COTIZACIONES DE " + tipo + " " + armarFecha(bkReporte.getFechaInicioCot(), bkReporte.getFechaFinalCot()));

        CellRangeAddress region = new CellRangeAddress(0, 0, 3, 7);
        sheet.addMergedRegion(region);


        int rowCli = 1;
        int rowCot = 2;
        int cantidadCot = 0;
        int rowResumen = 3;
        Cliente clienteAnt = null;
        boolean esPrimera = true;
        int cont = 1;
        for (Cotizacion cotiza1 : listaCotizacion) {
            if (clienteAnt != cotiza1.getIdCliente()) {
                cont = 1;
                if (!esPrimera) {

                    HSSFRow rowCantidades;

                    if (sheet.getRow(rowResumen) == null) {
                        rowCantidades = sheet.createRow(rowResumen);
                    } else {
                        rowCantidades = sheet.getRow(rowResumen);
                    }

                    HSSFCell cellR2 = rowCantidades.createCell(5);
                    cellR2.setCellValue(clienteAnt.getRazonSocial());
                    cellR2.setCellStyle(contStyle);

                    HSSFCell cellR3 = rowCantidades.createCell(6);
                    cellR3.setCellValue(cantidadCot);
                    cellR3.setCellStyle(contStyle);

                    cantidadCot = 0;
                    rowResumen++;
                    rowCot++;
                }
                rowCli = rowCot + 2;
                rowCot = rowCli + 1;
                esPrimera = false;

                HSSFRow rowC;
                if (sheet.getRow(rowCli) == null) {
                    rowC = sheet.createRow(rowCli);
                } else {
                    rowC = sheet.getRow(rowCli);
                }

                HSSFCell cellCli = rowC.createCell(0);
                cellCli.setCellStyle(cliStyle);
                cellCli.setCellValue(cotiza1.getIdCliente().getRazonSocial());

                region = new CellRangeAddress(rowCli, rowCli, 0, 3);
                RegionUtil.setBorderBottom(CellStyle.BORDER_THIN, region, sheet, wb);
                RegionUtil.setBorderTop(CellStyle.BORDER_THIN, region, sheet, wb);
                sheet.addMergedRegion(region);

                clienteAnt = cotiza1.getIdCliente();
            }

            HSSFRow rowD;
            if (sheet.getRow(rowCot) == null) {
                rowD = sheet.createRow(rowCot);
            } else {
                rowD = sheet.getRow(rowCot);
            }

            HSSFCell cellCont0 = rowD.createCell(0);
            cellCont0.setCellStyle(contStyle);
            cellCont0.setCellValue(cont);

            HSSFCell cellCont1 = rowD.createCell(1);
            cellCont1.setCellStyle(contStyle);
            cellCont1.setCellValue(cotiza1.getCodigo());

            HSSFCell cellCont2 = rowD.createCell(2);
            cellCont2.setCellStyle(contStyle);
            cellCont2.setCellValue(cotiza1.getNombreProducto());

            HSSFCell cellCont3 = rowD.createCell(3);
            cellCont3.setCellStyle(contStyle);
            cellCont3.setCellValue(cotiza1.getPrecioVenta().doubleValue());

            cantidadCot++;
            rowCot++;
            cont++;

        }
        if (clienteAnt != null) {
            rowCot++;
            System.out.println("rowResumen2: " + rowResumen);
            HSSFRow rowCantidades;

            if (sheet.getRow(rowResumen) == null) {
                rowCantidades = sheet.createRow(rowResumen);
            } else {
                rowCantidades = sheet.getRow(rowResumen);
            }

            HSSFCell cellR2 = rowCantidades.createCell(5);
            cellR2.setCellValue(clienteAnt.getRazonSocial());
            cellR2.setCellStyle(contStyle);

            HSSFCell cellR3 = rowCantidades.createCell(6);
            cellR3.setCellValue(cantidadCot);
            cellR3.setCellStyle(contStyle);


        }
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"Cotizaciones por Cliente.xls\"");

        wb.write(externalContext.getResponseOutputStream());
        facesContext.responseComplete();

    }

    public void marcarInicioCot(DateSelectEvent event) {
        bkReporte.setFechaInicioCot(event.getDate());
    }

    public void marcarFinalCot(DateSelectEvent event) {
        bkReporte.setFechaFinalCot(event.getDate());
    }

    public void reporteFactProfPorCliente() throws IOException, ServiceException {

        FacturaProforma facturaProforma = bkReporte.getFacturaProformaBusqueda();

        facturaProforma.setCodigoProforma(facturaProforma.getTipoFP() + "-");
        facturaProforma.setCodigoSwift("buscar");
        facturaProforma.setIdEmpresa(session.getEmpresa());
        facturaProforma.setOrigenProducto("");
        //facturaProforma.setTipoFP('%');
        Collection<FacturaProforma> listaFP = this.servicioFacturaProforma.buscarFacturaProformasPorFiltro(facturaProforma, bkReporte.getFechaInicioFP(), bkReporte.getFechaFinalFP());


        //Workbook workbook = new XSSFWorkbook(OPCPackage.open(new FileInputStream("d:/ChartSample.xlsx"))); // or sample.xls
        FileInputStream file = new FileInputStream(new File(serviceProperties.getProperty("path.server.excel") + "facturasProformas.xls"));
        HSSFWorkbook wb = new HSSFWorkbook(file);
        //HSSFSheet sheet = wb.createSheet("Cotizaciones");
        HSSFSheet sheet = wb.getSheetAt(0);

        sheet.setAutobreaks(true);
        sheet.setColumnWidth(0, 12000);
        sheet.setColumnWidth(1, 4000);
        sheet.setColumnWidth(2, 4000);

        sheet.setColumnWidth(5, 10000);
        sheet.setColumnWidth(6, 4000);
        sheet.setColumnWidth(7, 4000);
        sheet.setAlternativeFormula(true);
        //sheet.setVerticallyCenter(true);
        sheet.setRowSumsBelow(true);

        HSSFCellStyle borderStyle = wb.createCellStyle();
        borderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);


        HSSFCellStyle borderDotStyle = wb.createCellStyle();
        borderDotStyle.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderRight(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderTop(HSSFCellStyle.BORDER_DOTTED);
        /**
         * ***** fuente para titulo ******************
         */
        HSSFFont cabFont = wb.createFont();
        //cabFont.setColor(HSSFColor.RED.index);
        cabFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cabFont.setFontHeightInPoints(Short.valueOf("11"));

        HSSFCellStyle cabStyle = wb.createCellStyle();
        cabStyle.setFont(cabFont);
        cabStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        /**
         * ***** fuente para clientes ******************
         */
        HSSFFont cliFont = wb.createFont();
        cliFont.setColor(HSSFColor.BLUE.index);
        cliFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cliFont.setFontHeightInPoints(Short.valueOf("9"));

        HSSFCellStyle cliStyle = wb.createCellStyle();
        cliStyle.cloneStyleFrom(borderStyle);
        cliStyle.setFont(cliFont);
        cliStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        /**
         * ***** fuente para fp ******************
         */
        HSSFFont fpFont = wb.createFont();
        fpFont.setColor(HSSFColor.GREEN.index);
        fpFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        fpFont.setFontHeightInPoints(Short.valueOf("9"));

        HSSFCellStyle fpStyle = wb.createCellStyle();
        fpStyle.cloneStyleFrom(borderStyle);
        fpStyle.setFont(fpFont);


        /**
         * ***** fuente para total por cliente ******************
         */
        HSSFFont cantFont = wb.createFont();
        cantFont.setColor(HSSFColor.BROWN.index);
        cantFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cantFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle cantStyle = wb.createCellStyle();
        cantStyle.cloneStyleFrom(borderDotStyle);
        cantStyle.setFont(cantFont);


        /**
         * ***** fuente para detalle de cotizacion ******************
         */
        HSSFFont contFont = wb.createFont();
        contFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle contStyle = wb.createCellStyle();
        contStyle.cloneStyleFrom(borderDotStyle);
        contStyle.setFont(contFont);
        contStyle.setWrapText(true);


        /**
         * ***** fuente para generado por ******************
         */
        HSSFFont genFont = wb.createFont();
        genFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        genFont.setFontHeightInPoints(Short.valueOf("7"));


        HSSFCellStyle genStyle = wb.createCellStyle();
        genStyle.setFont(genFont);
        genStyle.setWrapText(true);


        HSSFRow rowCab = sheet.createRow(0);

        HSSFCell cellCab0 = rowCab.createCell(3);
        cellCab0.setCellStyle(cabStyle);
        String tipo = facturaProforma.getTipoFP() == 'T' ? "TELA" : "PRENDA";
        cellCab0.setCellValue("REPORTE DE FACTURAS PROFORMAS DE " + tipo + " " + armarFecha(bkReporte.getFechaInicioFP(), bkReporte.getFechaFinalFP()));

        CellRangeAddress region = new CellRangeAddress(0, 0, 3, 7);
        sheet.addMergedRegion(region);

        int rowCli = 1;
        int rowCot = 2;
        int cantidadFPA = 0;
        int cantidadFPN = 0;
        int rowResumen = 3;
        Cliente clienteAnt = null;
        boolean esPrimera = true;
        for (FacturaProforma proforma : listaFP) {
            proforma = servicioFacturaProforma.conseguirFacturaProformaPorId(proforma.getId());
            if (clienteAnt != proforma.getClienteMarca()) {

                if (!esPrimera) {

                    HSSFRow rowCantidades;

                    if (sheet.getRow(rowResumen) == null) {
                        rowCantidades = sheet.createRow(rowResumen);
                    } else {
                        rowCantidades = sheet.getRow(rowResumen);
                    }

                    HSSFCell cellR2 = rowCantidades.createCell(5);
                    cellR2.setCellValue(clienteAnt.getRazonSocial());
                    cellR2.setCellStyle(contStyle);

                    HSSFCell cellR3 = rowCantidades.createCell(6);
                    cellR3.setCellValue(cantidadFPA);
                    cellR3.setCellStyle(contStyle);

                    HSSFCell cellR4 = rowCantidades.createCell(7);
                    cellR4.setCellValue(cantidadFPN);
                    cellR4.setCellStyle(contStyle);

                    cantidadFPA = 0;
                    cantidadFPN = 0;
                    rowResumen++;

                }

                esPrimera = false;
                rowCli = rowCot + 2;
                rowCot = rowCli + 1;


                HSSFRow rowC = sheet.createRow(rowCli);

                HSSFCell cellCli = rowC.createCell(0);
                cellCli.setCellStyle(cliStyle);
                cellCli.setCellValue(proforma.getClienteMarca().getRazonSocial());

                region = new CellRangeAddress(rowCli, rowCli, 0, 2);
                RegionUtil.setBorderBottom(CellStyle.BORDER_THIN, region, sheet, wb);
                RegionUtil.setBorderTop(CellStyle.BORDER_THIN, region, sheet, wb);
                sheet.addMergedRegion(region);

                clienteAnt = proforma.getClienteMarca();
            }

            HSSFRow rowD = sheet.createRow(rowCot);

            HSSFCell cellFP0 = rowD.createCell(0);
            cellFP0.setCellStyle(fpStyle);
            cellFP0.setCellValue(proforma.getCodigoProforma());


            HSSFCell cellFP2 = rowD.createCell(1);
            cellFP2.setCellStyle(fpStyle);
            cellFP2.setCellValue(proforma.getEstadoProforma().equals("A") ? "Aprobado" : "No Aprobado");

            for (DetallePedidoFp detalle : proforma.getDetallePedidoFpCollection()) {
                rowCot++;
                HSSFRow rowE = sheet.createRow(rowCot);

                HSSFCell cellCont0 = rowE.createCell(0);
                cellCont0.setCellStyle(contStyle);
                cellCont0.setCellValue(detalle.getNombreProducto());

                HSSFCell cellCont1 = rowE.createCell(1);
                cellCont1.setCellStyle(contStyle);
                cellCont1.setCellValue(detalle.getCantidadUM() + "" + detalle.getUnidadMedida());

                String pv = "";
                if (proforma.getIdTipoMoneda().getId() == 1) {
                    pv = detalle.getPrecioUnitarioSoles() + " " + proforma.getIdTipoMoneda().getSimbolo() + "/" + detalle.getUnidadMedida();
                } else {
                    pv = detalle.getPrecioUnitario() + " " + proforma.getIdTipoMoneda().getSimbolo() + "/" + detalle.getUnidadMedida();
                }
                HSSFCell cellCont2 = rowE.createCell(2);
                cellCont2.setCellStyle(contStyle);
                cellCont2.setCellValue(pv);
            }

            if (proforma.getEstadoProforma().equals("A")) {
                cantidadFPA++;
            } else {
                cantidadFPN++;
            }


            rowCot++;

        }
        if (clienteAnt != null) {
            rowCot++;

            HSSFRow rowCantidades;

            if (sheet.getRow(rowResumen) == null) {
                rowCantidades = sheet.createRow(rowResumen);
            } else {
                rowCantidades = sheet.getRow(rowResumen);
            }

            HSSFCell cellR2 = rowCantidades.createCell(5);
            cellR2.setCellValue(clienteAnt.getRazonSocial());
            cellR2.setCellStyle(contStyle);

            HSSFCell cellR3 = rowCantidades.createCell(6);
            cellR3.setCellValue(cantidadFPA);
            cellR3.setCellStyle(contStyle);

            HSSFCell cellR4 = rowCantidades.createCell(7);
            cellR4.setCellValue(cantidadFPN);
            cellR4.setCellStyle(contStyle);


        }
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"Fact Prof por Cliente.xls\"");

        wb.write(externalContext.getResponseOutputStream());
        facesContext.responseComplete();
    }

    public void marcarInicioFP(DateSelectEvent event) {
        bkReporte.setFechaInicioFP(event.getDate());
    }

    public void marcarFinalFP(DateSelectEvent event) {
        bkReporte.setFechaFinalFP(event.getDate());
    }

    public Collection<OrdenPedido> buscarOrdenPedido(String ordenPedidoABuscar) {

        Collection<OrdenPedido> listaOrdenesPedidoEncontrados = new ArrayList<OrdenPedido>();
        for (OrdenPedido ordenPedido : bkReporte.getListaOrdenesPedido()) {
            if (ordenPedido.getCodigoOrdenPedido().contains(ordenPedidoABuscar)) {
                listaOrdenesPedidoEncontrados.add(ordenPedido);
            }
        }
        return listaOrdenesPedidoEncontrados;

    }

    public void reportekardexPorOP() {

        try {

            if (bkReporte.getOrdenPedidoBusqueda() != null) {

                Kardex kardex = new Kardex();
                kardex.setIdOrdenPedido(bkReporte.getOrdenPedidoBusqueda());
                kardex.setTiMovimiento(Constantes.TipoMovimiento.SALIDA);
                kardex = servicioKardex.buscarKardexSalidaMasAntiguo(kardex);

                if (kardex != null && kardex.getArticulo() != null) {
                    armarReporteLiquidacion(bkReporte.getOrdenPedidoBusqueda());
                    //armarReporteKardexTela(kardex.getArticulo().getIdCategoriaArticulo().getIdCategoriaArticulo());
                } else {
                    mostrarError("No ha comenzado la produccion");
                }



            } else {
                mostrarError("Elegir una OP");
            }
        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }

    public void armarReporteLiquidacion(OrdenPedido ordenP) {
        Collection<Kardex> listaInicial = null;

        Collection<OrdenCompraServicio> listaOrdenServicio = new ArrayList<OrdenCompraServicio>();
        try {
            OrdenCompraServicio ordenOCS = new OrdenCompraServicio();
            ordenOCS.setEstadoOrden("" + OrdenCompraServicio.ESTADO_ORDEN_SC.BORRADOR.getValor());
            ordenOCS.setIdOrdenPedido(ordenP);
            ordenOCS.setTipo('S');
            String[] listaEsdado = {"" + OrdenCompraServicio.ESTADO_ORDEN_SC.ANULADO.getValor(),
                "" + OrdenCompraServicio.ESTADO_ORDEN_SC.BORRADOR.getValor()};
            listaOrdenServicio = servicioOCS.listarOrdenCSConCodigoPorOP(ordenOCS, listaEsdado);

        } catch (ServiceException e) {
            e.printStackTrace();
        }

        List<String> servicios = new ArrayList<String>();
        System.out.println("lista ade servicios: " + listaOrdenServicio);
        for (OrdenCompraServicio ordenS : listaOrdenServicio) {
            System.out.println("servicio: " + ordenS.getServicio());
            if (!servicios.contains(ordenS.getServicio())) {
                servicios.add(ordenS.getServicio());
            }
            System.out.println("servicios: " + servicios);
        }

        List<GuiaRemision> listaGuiasSalidaPorBloque = new ArrayList<GuiaRemision>();
        List<GuiaRemision> listaGuiasEntradaPorBloque = new ArrayList<GuiaRemision>();


        Short[] listaColores = {HSSFColor.GREY_25_PERCENT.index,
            HSSFColor.PALE_BLUE.index,
            HSSFColor.LIGHT_GREEN.index,
            HSSFColor.CORAL.index,
            HSSFColor.LEMON_CHIFFON.index};

        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("Liquidacion");

        sheet.setAutobreaks(true);
        sheet.setAlternativeFormula(true);
        //sheet.setVerticallyCenter(true);
        sheet.setRowSumsBelow(true);


        HSSFPalette palette = wb.getCustomPalette();


        HSSFCellStyle borderStyle = wb.createCellStyle();
        borderStyle.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
        borderStyle.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);
        borderStyle.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);
        borderStyle.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);

        HSSFCellStyle borderTBStyle = wb.createCellStyle();
        borderTBStyle.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
        borderTBStyle.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);

        /**
         * ***** fuente para cabecera ******************
         */
        HSSFFont cabFont = wb.createFont();
        cabFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cabFont.setFontHeightInPoints(Short.valueOf("8"));

        HSSFCellStyle cabStyle = wb.createCellStyle();
        cabStyle.cloneStyleFrom(borderTBStyle);
        cabStyle.setWrapText(true);
        cabStyle.setFont(cabFont);


        /**
         * ***** fuente para titulos ******************
         */
        HSSFFont titFont = wb.createFont();
        titFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        titFont.setFontHeightInPoints(Short.valueOf("9"));



        /**
         * ***** fuente para negrita normal ******************
         */
        HSSFFont negFont = wb.createFont();
        negFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        negFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle negStyle = wb.createCellStyle();
        negStyle.setFont(negFont);


        /**
         * fuente para normal ***************
         */
        HSSFFont norFont = wb.createFont();
        norFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle norStyle = wb.createCellStyle();
        norStyle.setFont(norFont);


        palette.setColorAtIndex(HSSFColor.LIGHT_ORANGE.index, (byte) 252, (byte) 213, (byte) 180);

        /**
         * ***** fuente para resultados ******************
         */
        HSSFCellStyle resStyleNormal = wb.createCellStyle();
        resStyleNormal.cloneStyleFrom(borderTBStyle);
        resStyleNormal.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
        resStyleNormal.setFont(norFont);

        HSSFCellStyle resStyle = wb.createCellStyle();
        resStyle.setFillForegroundColor(HSSFColor.LIGHT_ORANGE.index);
        resStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        resStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
        resStyle.setFont(norFont);

        HSSFCellStyle resStyleNumber = wb.createCellStyle();
        resStyleNumber.cloneStyleFrom(borderTBStyle);
        resStyleNumber.setFillForegroundColor(HSSFColor.LIGHT_ORANGE.index);
        resStyleNumber.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        resStyleNumber.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
        resStyleNumber.setFont(norFont);

        /**
         * ***** setilo para resultados encabezado ******************
         */
        HSSFCellStyle resNStyle = wb.createCellStyle();
        resNStyle.cloneStyleFrom(borderTBStyle);
        resNStyle.setFillForegroundColor(HSSFColor.LIGHT_ORANGE.index);
        resNStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        resNStyle.setFont(negFont);

        int c = 0;
        int i = 0;
        int j = 0;
        int cellCount = 0;
        int rowCountResult = 5;


        HSSFRow row = sheet.createRow(1);
        HSSFRow rowComp = sheet.createRow(2);

        HSSFCell cell = row.createCell(0);
        GuiaRemision guiaBusqueda = new GuiaRemision();
        guiaBusqueda.setParametroMotivoGuia(new ParametroDetalle());

        try {
            while (j < servicios.size()) {
                int countAnt = rowCountResult;
                for (OrdenCompraServicio os : listaOrdenServicio) {
                    if (os.getServicio().equals(servicios.get(j))) {
                        for (GuiaRemision guia : os.getGuiaRemisionCollection()) {
                            if (!guia.getEstadoGuia().equalsIgnoreCase("" + GuiaRemision.ESTADO_GUIA_REMISION.ANULADO.getValor())) {
                                rowCountResult += guia.getDetalleGuiaRemisions().size();
                            }

                        }

                    }

                }
                if (rowCountResult < countAnt) {
                    rowCountResult = countAnt;
                }
                j++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("total de filas: " + rowCountResult);
        rowCountResult += 1;
        boolean esInsumo = true;
        while (i < servicios.size()) {
            listaGuiasSalidaPorBloque = new ArrayList<GuiaRemision>();
            listaGuiasEntradaPorBloque = new ArrayList<GuiaRemision>();
            Iterator itr = listaOrdenServicio.iterator();
            try {
                while (itr.hasNext()) {
                    OrdenCompraServicio orden = (OrdenCompraServicio) itr.next();
                    guiaBusqueda.setIdOrdenCompraServicio(orden);

                    if (orden.getServicio().equals(servicios.get(i))) {
                        guiaBusqueda.getParametroTipoGuia().setId(Constantes.TipoGuiaRemision.GUIA_SALIDA);
                        listaGuiasSalidaPorBloque.addAll(servicioGuia.listarGuiaRemisionPorFiltro(guiaBusqueda));

                        guiaBusqueda.getParametroTipoGuia().setId(Constantes.TipoGuiaRemision.GUIA_ENTRADA);
                        listaGuiasEntradaPorBloque.addAll(servicioGuia.listarGuiaRemisionPorFiltro(guiaBusqueda));

                        if (!esInsumo) {
                            itr.remove();
                        }

                    }

                }
            } catch (ServiceException e) {
                e.printStackTrace();
            }


            /**
             * ************ fuente por bloque *******
             */
            HSSFCellStyle compCabStyle = wb.createCellStyle();
            compCabStyle.cloneStyleFrom(borderTBStyle);

            HSSFCellStyle titStyle = wb.createCellStyle();
            titStyle.cloneStyleFrom(borderStyle);
            if (listaColores[c] == null) {
                titStyle.setFillForegroundColor(listaColores[c - 5]);
                compCabStyle.setFillForegroundColor(listaColores[c - 5]);
            } else {
                titStyle.setFillForegroundColor(listaColores[c]);
                compCabStyle.setFillForegroundColor(listaColores[c]);
            }
            //titStyle.setFillForegroundColor(listaColores[i]);
            titStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            titStyle.setFont(titFont);
            titStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

            compCabStyle.setWrapText(true);
            compCabStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            compCabStyle.setFont(negFont);

            row = sheet.getRow(1);
            cell = row.createCell(cellCount);
            cell.setCellStyle(titStyle);


            int countRow = 5;
            BigDecimal costoTotal = BigDecimal.ZERO;
            BigDecimal cantidadTotal = BigDecimal.ZERO;
            BigDecimal cantidadMermaTotal = BigDecimal.ZERO;

            if (esInsumo) {


                cell.setCellValue("INSUMOS");
                CellRangeAddress region = new CellRangeAddress(1, 1, cellCount, (cellCount + 11));

                RegionUtil.setBorderBottom(CellStyle.BORDER_MEDIUM, region, sheet, wb);
                RegionUtil.setBorderTop(CellStyle.BORDER_MEDIUM, region, sheet, wb);
                RegionUtil.setBorderLeft(CellStyle.BORDER_MEDIUM, region, sheet, wb);

                sheet.addMergedRegion(region);

                row = sheet.createRow(4);

                row = armarCabeceraInsumos(row, cabStyle, resNStyle, cellCount);

                for (GuiaRemision guia : listaGuiasSalidaPorBloque) {
                    for (Kardex kardex : guia.getKardexCollection()) {
                        row = sheet.createRow(countRow);
                        cantidadTotal = cantidadTotal.add(kardex.getCaMovimiento().negate());
                        costoTotal = costoTotal.add(kardex.getVaCostoPromedio());
                        row = armarContenidoInsumos(row, norStyle, resStyle, kardex, cellCount);

                        countRow++;

                    }

                }

                for (int l = countRow; l <= rowCountResult; l++) {
                    row = sheet.createRow(l);
                    for (int k = cellCount; k <= cellCount + 11; k++) {
                        cell = row.createCell(k);
                        if (l == rowCountResult) {
                            cell.setCellStyle(borderTBStyle);
                        } else {
                            if (k == (cellCount + 10) || k == (cellCount + 11)) {
                                cell.setCellStyle(resStyle);
                            }
                        }

                    }
                }

                cell = row.createCell(cellCount + 9);
                cell.setCellStyle(resStyleNormal);
                cell.setCellValue(cantidadTotal.doubleValue());

                cell = row.createCell(cellCount + 10);
                cell.setCellStyle(resStyleNumber);

                cell = row.createCell(cellCount + 11);
                cell.setCellStyle(resStyleNumber);
                cell.setCellValue(costoTotal.doubleValue());

                CellRangeAddress cuadroMayor = new CellRangeAddress(1, rowCountResult, cellCount, (cellCount + 11));

                RegionUtil.setBorderRight(CellStyle.BORDER_MEDIUM, cuadroMayor, sheet, wb);

                cellCount += 12;
                esInsumo = false;

            } else {
                Collection<Articulo> listaArtEntrada = new ArrayList<Articulo>();

                for (GuiaRemision guia : listaGuiasSalidaPorBloque) {
                    for (Kardex kardex : guia.getKardexCollection()) {
                        /*if (!listaArtEntrada.contains(kardex.getArticulo())) {
                         listaArtEntrada.add(kardex.getArticulo());
                         }*/
                        boolean encontro = false;
                        for (Articulo arti : listaArtEntrada) {
                            if (arti.getId().equals(kardex.getArticulo().getId())) {
                                encontro = true;
                                break;
                            }
                        }
                        if (!encontro) {
                            listaArtEntrada.add(kardex.getArticulo());
                        }


                    }
                }

                int countBase = 15 + listaArtEntrada.size();

                cell.setCellValue(servicios.get(i));
                CellRangeAddress region = new CellRangeAddress(1, 1, cellCount, (cellCount + countBase));

                RegionUtil.setBorderBottom(CellStyle.BORDER_MEDIUM, region, sheet, wb);
                RegionUtil.setBorderTop(CellStyle.BORDER_MEDIUM, region, sheet, wb);
                RegionUtil.setBorderLeft(CellStyle.BORDER_MEDIUM, region, sheet, wb);

                sheet.addMergedRegion(region);

                row = sheet.getRow(4);

                row = armarCabeceraServicios(row, cabStyle, resNStyle, cellCount, listaArtEntrada, compCabStyle);

                cell = rowComp.createCell(cellCount + 9);



                for (GuiaRemision guia : listaGuiasEntradaPorBloque) {
                    if (!guia.getParametroMotivoGuia().getValCadena().equalsIgnoreCase("DEVOLUCION")) {
                        for (Kardex kardex : guia.getKardexCollection()) {
                            if (kardex.getEstadoRegistro().equalsIgnoreCase(String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor()))) {
                                row = sheet.getRow(countRow);

                                System.out.println("row : " + row);
                                System.out.println("countRow : " + countRow);
                                row = armarContenidoServicio(row, norStyle, resStyle, kardex, cellCount,
                                        guia.getIdOrdenCompraServicio().getPorcentajeMerma(), rowComp,
                                        listaArtEntrada, compCabStyle);

                                countRow++;
                            }

                        }


                    }


                }
                row = sheet.getRow(rowCountResult);

                for (int l = countRow; l <= rowCountResult; l++) {
                    row = sheet.getRow(l);
                    for (int k = cellCount; k <= cellCount + countBase; k++) {
                        cell = row.createCell(k);
                        if (l == rowCountResult) {
                            cell.setCellStyle(borderTBStyle);
                        } else {
                            if (k == (cellCount + countBase - 1) || k == (cellCount + countBase)
                                    || k == (cellCount + countBase) - 2) {
                                cell.setCellStyle(resStyle);
                            }
                        }

                    }
                }

                cell = row.createCell(cellCount + countBase - 2);
                cell.setCellStyle(resStyleNumber);

                cell = row.createCell(cellCount + countBase - 1);
                cell.setCellStyle(resStyleNumber);

                cell = row.createCell(cellCount + countBase);
                cell.setCellStyle(resStyleNumber);
                cell.setCellValue("");


                CellRangeAddress cuadroMayor = new CellRangeAddress(1, rowCountResult, cellCount, (cellCount + countBase));

                RegionUtil.setBorderRight(CellStyle.BORDER_MEDIUM, cuadroMayor, sheet, wb);

                cellCount += countBase + 1;

                i++;
            }
            c++;
        }

        String filename = "Liquidacion_" + ordenP.getCodigoOrdenPedido() + ".xls";
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();

        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=" + filename);


        try {

            wb.write(externalContext.getResponseOutputStream());
            facesContext.responseComplete();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    public HSSFRow armarCabeceraServicios(HSSFRow row, HSSFCellStyle titStyle,
            HSSFCellStyle resNStyle, int cellCount, Collection<Articulo> lista, HSSFCellStyle compCabStyle) {
        HSSFCell cell = row.createCell(cellCount);
        cell.setCellStyle(titStyle);
        cell.setCellValue("FECHA DE SALIDA");

        cell = row.createCell(cellCount + 1);
        cell.setCellStyle(titStyle);
        cell.setCellValue("PROVEEDOR ");

        cell = row.createCell(cellCount + 2);
        cell.setCellStyle(titStyle);
        cell.setCellValue("GUIA REMISION SALIDA");

        cell = row.createCell(cellCount + 3);
        cell.setCellStyle(titStyle);
        cell.setCellValue("FACTURA PROVEEDOR");

        cell = row.createCell(cellCount + 4);
        cell.setCellStyle(titStyle);
        cell.setCellValue("ORDEN DE SERVICIO");

        cell = row.createCell(cellCount + 5);
        cell.setCellStyle(titStyle);
        cell.setCellValue("GUIA REMISION " + session.getEmpresa().getNombreComercial());

        cell = row.createCell(cellCount + 6);
        cell.setCellStyle(titStyle);
        cell.setCellValue("DESCRIPCIÓN");

        cell = row.createCell(cellCount + 7);
        cell.setCellStyle(titStyle);
        cell.setCellValue("PARTIDA/LOTE");

        cell = row.createCell(cellCount + 8);
        cell.setCellStyle(titStyle);
        cell.setCellValue("EMPAQUE");

        cell = row.createCell(cellCount + 9);
        cell.setCellStyle(titStyle);
        cell.setCellValue("UM");

        cell = row.createCell(cellCount + 10);
        cell.setCellStyle(titStyle);
        cell.setCellValue("CANTIDAD CON MERMA");

        cell = row.createCell(cellCount + 11);
        cell.setCellStyle(titStyle);
        cell.setCellValue("CANTIDAD");

        cell = row.createCell(cellCount + 12);
        cell.setCellStyle(titStyle);
        cell.setCellValue("MERMA");

        for (Articulo art : lista) {
            cellCount++;
            cell = row.createCell(cellCount + 12);
            cell.setCellStyle(compCabStyle);
            cell.setCellValue(art.getNombreComercial());
        }

        cell = row.createCell(cellCount + 13);
        cell.setCellStyle(resNStyle);
        cell.setCellValue("SERVICIO $/UM");

        cell = row.createCell(cellCount + 14);
        cell.setCellStyle(resNStyle);
        cell.setCellValue("PRODUCTO $/UM");

        cell = row.createCell(cellCount + 15);
        cell.setCellStyle(resNStyle);
        cell.setCellValue("$");

        return row;
    }

    public HSSFRow armarContenidoServicio(HSSFRow row, HSSFCellStyle norStyle, HSSFCellStyle resStyle,
            Kardex kardex, int cellCount, BigDecimal merma, HSSFRow rowComp,
            Collection<Articulo> lista, HSSFCellStyle compCabStyle) {
        HSSFCell cell = row.createCell(0);
        Kardex kardex1 = null;
        
        try {
            kardex1 = servicioKardex.buscarKardexSPorKardexE(kardex);
        } catch (ServiceException e) {
            e.printStackTrace();
        }
        
        cell = row.createCell(cellCount);
        cell.setCellStyle(norStyle);
        cell.setCellValue(UtilitarioFecha.formatearFecha(kardex.getFecMovimiento(), "dd/MM/yyyy"));


        cell = row.createCell(cellCount + 1);
        cell.setCellStyle(norStyle);
        cell.setCellValue(kardex.getIdGuiaRemision().getSedePartida().getIdProveedor().getNombreComercial());

        cell = row.createCell(cellCount + 2);
        cell.setCellStyle(norStyle);
        cell.setCellValue(kardex.getIdGuiaRemision().getSerie() + "-" + kardex.getIdGuiaRemision().getNumeroGuia());

        cell = row.createCell(cellCount + 3);
        cell.setCellStyle(norStyle);
        if (kardex.getIdGuiaRemision().getIdFactura() != null) {
            cell.setCellValue(kardex.getIdGuiaRemision().getIdFactura().getSerie() + "-" + kardex.getIdGuiaRemision().getIdFactura().getNumeroFactura());
        }

        cell = row.createCell(cellCount + 4);
        cell.setCellStyle(norStyle);
        if (kardex.getIdGuiaRemision().getIdOrdenCompraServicio() != null) {
            cell.setCellValue(kardex.getIdGuiaRemision().getIdOrdenCompraServicio().getCodigo());
        }


        if (kardex1 != null) {
            cell = row.createCell(cellCount + 5);
            cell.setCellStyle(norStyle);
            cell.setCellValue(kardex1.getIdGuiaRemision().getSerie() + "-" + kardex1.getIdGuiaRemision().getNumeroGuia());
        }

        cell = row.createCell(cellCount + 6);
        cell.setCellStyle(norStyle);
        cell.setCellValue(kardex.getArticulo().getNombreComercial());

        cell = row.createCell(cellCount + 7);
        cell.setCellStyle(norStyle);
        cell.setCellValue(kardex.getPartidaLote());

        cell = row.createCell(cellCount + 8);
        cell.setCellStyle(norStyle);
        cell.setCellValue(kardex.getUnidadMedida().getAbrev());

        cell = row.createCell(cellCount + 9);
        cell.setCellStyle(norStyle);
        cell.setCellValue(kardex.getUnidadMedida().getAbrev());
        float cantidadConMerma = 0;
        if (kardex1 != null) {
            float cantidad = kardex1.getCaMovimiento().negate().floatValue();
            cantidadConMerma = kardex1.getCaMovimiento().negate().multiply(BigDecimal.ONE.add(merma.divide(new BigDecimal(100)))).floatValue();
            cell = row.createCell(cellCount + 10);
            cell.setCellStyle(norStyle);
            cell.setCellValue(cantidadConMerma);

            cell = row.createCell(cellCount + 11);
            cell.setCellStyle(norStyle);
            cell.setCellValue(cantidad);

            cell = row.createCell(cellCount + 12);
            cell.setCellStyle(norStyle);
            cell.setCellValue(merma.setScale(2).floatValue());



            for (Articulo art : lista) {
                BigDecimal comp = BigDecimal.ZERO;
                for (ComposicionArticulo artComp : kardex.getArticulo().getComposicionArticuloCollection()) {
                    if (art == artComp.getIdArticuloComp()) {
                        comp = artComp.getCantidad();
                        if (artComp.getTipo().equals("%")) {
                            comp = comp.divide(new BigDecimal(100));
                        }
                    }
                }
                cellCount++;
                cell = row.createCell(cellCount + 12);
                cell.setCellStyle(norStyle);
                cell.setCellValue(comp.floatValue() * cantidadConMerma);

                cell = rowComp.createCell(cellCount + 12);
                cell.setCellStyle(compCabStyle);
                cell.setCellValue(comp.doubleValue());

            }

            cell = row.createCell(cellCount + 13);
            cell.setCellStyle(resStyle);
            double costoServicio = 0;
            for (DetalleGuiaRemision detalle : kardex.getIdGuiaRemision().getDetalleGuiaRemisions()) {
                if (detalle.getEstadoRegistro().equalsIgnoreCase("" + ESTADO_REGISTRO.ACTIVO.getValor())
                        && detalle.getArticulo().getId().equals(kardex.getArticulo().getId())
                        && detalle.getPartidaLote().equalsIgnoreCase(kardex.getPartidaLote())) {
                    costoServicio = detalle.getDetalleOrdenCompraServicio().getPrecio().doubleValue();
                }
            }
            cell.setCellValue(costoServicio);

            cell = row.createCell(cellCount + 14);
            cell.setCellStyle(resStyle);
            cell.setCellValue(kardex1.getVaCostoArticulo().setScale(2).doubleValue());

            cell = row.createCell(cellCount + 15);
            cell.setCellStyle(resStyle);
            cell.setCellValue(kardex1.getVaCostoPromedio().setScale(2).doubleValue());
        } else {
            cellCount += lista.size();

            cell = row.createCell(cellCount + 13);
            cell.setCellStyle(resStyle);
            cell.setCellValue("");

            cell = row.createCell(cellCount + 14);
            cell.setCellStyle(resStyle);
            cell.setCellValue("");

            cell = row.createCell(cellCount + 15);
            cell.setCellStyle(resStyle);
            cell.setCellValue("");
        }


        return row;
    }

    public HSSFRow armarCabeceraInsumos(HSSFRow row, HSSFCellStyle titStyle, HSSFCellStyle resNStyle,
            int cellCount) {
        HSSFCell cell = row.createCell(cellCount);
        cell.setCellStyle(titStyle);
        cell.setCellValue("FECHA DE INGRESO");

        cell = row.createCell(cellCount + 1);
        cell.setCellStyle(titStyle);
        cell.setCellValue("PROVEEDOR ");

        cell = row.createCell(cellCount + 2);
        cell.setCellStyle(titStyle);
        cell.setCellValue("GUIA REMISION ENTRADA");

        cell = row.createCell(cellCount + 3);
        cell.setCellStyle(titStyle);
        cell.setCellValue("FACTURA PROVEEDOR");

        cell = row.createCell(cellCount + 4);
        cell.setCellStyle(titStyle);
        cell.setCellValue("ORDEN DE COMPRA");

        cell = row.createCell(cellCount + 5);
        cell.setCellStyle(titStyle);
        cell.setCellValue("GUIA REMISION " + session.getEmpresa().getNombreComercial());

        cell = row.createCell(cellCount + 6);
        cell.setCellStyle(titStyle);
        cell.setCellValue("DESCRIPCIÓN");

        cell = row.createCell(cellCount + 7);
        cell.setCellStyle(titStyle);
        cell.setCellValue("PARTIDA/LOTE");

        cell = row.createCell(cellCount + 8);
        cell.setCellStyle(titStyle);
        cell.setCellValue("UM");

        cell = row.createCell(cellCount + 9);
        cell.setCellStyle(titStyle);
        cell.setCellValue("CANTIDAD");

        cell = row.createCell(cellCount + 10);
        cell.setCellStyle(resNStyle);
        cell.setCellValue("$/UM");

        cell = row.createCell(cellCount + 11);
        cell.setCellStyle(resNStyle);
        cell.setCellValue("$");

        return row;
    }

    public HSSFRow armarContenidoInsumos(HSSFRow row, HSSFCellStyle norStyle, HSSFCellStyle resStyle,
            Kardex kardex, int cellCount) {
        /*try{
         } catch (ServiceException e) {
         e.printStackTrace();
         }*/

        HSSFCell cell;

        Kardex kardex1 = null;
        try {
            kardex1 = servicioKardex.buscarKardexEPorKardexS(kardex);
        } catch (ServiceException e) {
            e.printStackTrace();
        }

        cell = row.createCell(cellCount);
        cell.setCellStyle(norStyle);
        cell.setCellValue(UtilitarioFecha.formatearFecha(kardex.getFecMovimiento(), "dd/MM/yyyy"));

        if (kardex1 != null) {
            cell = row.createCell(cellCount + 1);
            cell.setCellStyle(norStyle);
            cell.setCellValue(kardex1.getIdGuiaRemision().getSedePartida().getIdProveedor().getNombreComercial());

            cell = row.createCell(cellCount + 2);
            cell.setCellStyle(norStyle);
            cell.setCellValue(kardex1.getIdGuiaRemision().getSerie() + "-" + kardex1.getIdGuiaRemision().getNumeroGuia());

            cell = row.createCell(cellCount + 3);
            cell.setCellStyle(norStyle);
            if (kardex1.getIdGuiaRemision().getIdFactura() != null) {
                cell.setCellValue(kardex1.getIdGuiaRemision().getIdFactura().getSerie() + "-" + kardex1.getIdGuiaRemision().getIdFactura().getNumeroFactura());
            }

            cell = row.createCell(cellCount + 4);
            cell.setCellStyle(norStyle);
            if (kardex1.getIdGuiaRemision().getIdOrdenCompraServicio() != null) {
                cell.setCellValue(kardex1.getIdGuiaRemision().getIdOrdenCompraServicio().getCodigo());
            }

        }

        cell = row.createCell(cellCount + 5);
        cell.setCellStyle(norStyle);
        cell.setCellValue(kardex.getIdGuiaRemision().getSerie() + "-" + kardex.getIdGuiaRemision().getNumeroGuia());

        cell = row.createCell(cellCount + 6);
        cell.setCellStyle(norStyle);
        cell.setCellValue(kardex.getArticulo().getNombreComercial());

        cell = row.createCell(cellCount + 7);
        cell.setCellStyle(norStyle);
        cell.setCellValue(kardex.getPartidaLote());

        cell = row.createCell(cellCount + 8);
        cell.setCellStyle(norStyle);
        cell.setCellValue(kardex.getUnidadMedida().getAbrev());


        norStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
        cell = row.createCell(cellCount + 9);
        cell.setCellStyle(norStyle);
        cell.setCellValue(kardex.getCaMovimiento().negate().doubleValue());
        cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);

        cell = row.createCell(cellCount + 10);
        cell.setCellStyle(resStyle);
        cell.setCellValue(kardex.getVaCostoArticulo().doubleValue());

        cell = row.createCell(cellCount + 11);
        cell.setCellStyle(resStyle);
        cell.setCellValue(kardex.getVaCostoPromedio().doubleValue());

        return row;
    }

    public String armarFecha(Date inicio, Date fin) {
        String fecha = "";
        if (inicio == null && fin == null) {
            fecha = "Al " + UtilitarioFecha.formatearFecha(new Date(), "dd MMMM yyyy").toUpperCase();
        } else if (inicio != null && fin != null) {
            fecha = "Del " + UtilitarioFecha.formatearFecha(inicio, "dd MMMM yyyy").toUpperCase() + " al "
                    + UtilitarioFecha.formatearFecha(fin, "dd MMMM yyyy").toUpperCase();
        } else if (inicio == null) {
            fecha = "Al " + UtilitarioFecha.formatearFecha(fin, "dd MMMM yyyy").toUpperCase();
        } else if (fin == null) {
            fecha = "Del " + UtilitarioFecha.formatearFecha(inicio, "dd MMMM yyyy").toUpperCase() + " al "
                    + UtilitarioFecha.formatearFecha(new Date(), "dd MMMM yyyy").toUpperCase();
        }


        return fecha;
    }
}
